home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include "global.h"
- #include "mbuf.h"
- #include "socket.h"
- #include "telnet.h"
- #include "session.h"
- #include "proc.h"
- #include "tty.h"
- #include "mailbox.h"
- #include "commands.h"
- #include "config.h"
- #include "files.h"
-
- static int Sttylink = -1; /* Protoype socket for service */
- #ifdef MAILBOX
- static int Stelnet = -1;
- #endif
- static char Tnbanner1[] = "Welcome to TTY-Link at %s\n";
- static char Tnbanner2[] = "The System is Unattended";
- extern int Attended;
-
- int
- ttylstart(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- struct sockaddr_in lsocket;
- int s,type;
-
- if(Sttylink != -1){
- freeargs(argc,argv);
- return 0;
- }
- psignal(Curproc,0); /* Don't keep the parser waiting */
- chname(Curproc,"TTYlink listener");
-
- lsocket.sin_family = AF_INET;
- lsocket.sin_addr.s_addr = INADDR_ANY;
- if(argc < 2)
- lsocket.sin_port = IPPORT_TTYLINK;
- else
- lsocket.sin_port = atoi(argv[1]);
-
- freeargs(argc,argv);
- Sttylink = socket(AF_INET,SOCK_STREAM,0);
- bind(Sttylink,(char *)&lsocket,sizeof(lsocket));
- listen(Sttylink,1);
- for(;;){
- if((s = accept(Sttylink,NULLCHAR,(int *)NULL)) == -1)
- break; /* Service is shutting down */
-
- if(availmem() < Memthresh){
- usprintf(s,"System is overloaded; try again later\r\n");
- shutdown(s,1);
- } else {
- type = TELNET;
- newproc("ttylink",2048,ttylhandle,s,(void *)&type,NULL);
- }
- }
- return 0;
- }
- /* This function handles all incoming "ttylink" sessions, be they TCP,
- * NET/ROM or AX.25
- */
- void
- ttylhandle(s,t,p)
- int s;
- void *t;
- void *p;
- {
- int type,index;
- struct session *sp;
- char addr[MAXSOCKSIZE],buf2[77];
- int len = MAXSOCKSIZE;
- struct telnet tn;
- FILE *fp;
-
- type = * (int *)t;
- sockowner(s,Curproc); /* We own it now */
- mainlog(s,"open %s",Sestypes[type]);
-
- if(!Attended){
- usprintf(s, "%s\n",
- ((p = getenv("MBATND")) == NULL) ? Tnbanner2 : p);
- close_s(s);
- mainlog(s,"close %s - Unattended",Sestypes[type]);
- return;
- }
-
- /* Allocate a session descriptor */
- if((sp = newsession(NULLCHAR,type)) == NULLSESSION){
- usprintf(s,"Too many sessions\n");
- close_s(s);
- mainlog(s,"close %s - Too many sessions",Sestypes[type]);
- return;
- }
- index = sp - Sessions;
-
- /* Initialize a Telnet protocol descriptor */
- memset((char *)&tn,0,sizeof(tn));
- tn.session = sp; /* Upward pointer */
- sp->cb.telnet = &tn; /* Downward pointer */
- sp->s = s;
- sp->proc = Curproc;
-
- getpeername(s,addr,&len);
- tprintf("\007Incoming %s session %u from %s\007\n",
- Sestypes[type],index,psocket(addr));
-
- usprintf(s, Tnbanner1, Hostname);
-
- sprintf(buf2,"%s/TTY.SignOn",SignOn);
- if((fp = fopen(buf2,READ_TEXT)) != NULLFILE) {
- sendfile(fp,s,ASCII_TYPE,0);
- fclose(fp);
- }
-
- tnrecv(&tn);
- }
-
- /* Shut down Ttylink server */
- int
- ttyl0(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- close_s(Sttylink);
- Sttylink = -1;
- return 0;
- }
-
- #ifdef MAILBOX
- /* Start up Telnet server */
- int
- telnet1(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- struct sockaddr_in lsocket;
- int s;
- int type;
-
- if(Stelnet != -1){
- freeargs(argc,argv);
- return 0;
- }
- psignal(Curproc,0); /* Don't keep the parser waiting */
- chname(Curproc,"Telnet listener");
-
- lsocket.sin_family = AF_INET;
- lsocket.sin_addr.s_addr = INADDR_ANY;
- if(argc < 2)
- lsocket.sin_port = IPPORT_TELNET;
- else
- lsocket.sin_port = atoi(argv[1]);
- freeargs(argc,argv);
- Stelnet = socket(AF_INET,SOCK_STREAM,0);
- bind(Stelnet,(char *)&lsocket,sizeof(lsocket));
- listen(Stelnet,1);
- for(;;){
- if((s = accept(Stelnet,NULLCHAR,(int *)NULL)) == -1)
- break; /* Service is shutting down */
-
- if(availmem() < Memthresh){
- shutdown(s,1);
- } else {
- /* Spawn a server */
- type = TELNET;
- newproc("mbox",2048,mbx_incom,s,(void *)&type,NULL);
- }
- }
- return 0;
- }
- /* Stop telnet server */
- int
- telnet0(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- close_s(Stelnet);
- Stelnet = -1;
- return 0;
- }
- #endif
-
-